gusucode.com > LTE基带收发仿真系统matlab源码程序 > LTE baseband simulation/demo_DSH_process.m
% function demo_DSH_process % 请从LTE_main_gui_final.m文件开始运行 % 下行共享信道数据生成 % 基站的基带处理函数,该函数仅用户数据信道,PDSCH处理流程为: % 产生信息-->CRC校验-->码块分割-->turbo编码-->速率匹配 % -->加扰-->层映射-->预编码-->子载波映射-->OFDM调制-->天线映射 % % Author: 程式小组(徐萌 张妙 张晓庆) % Date: 2010-07-11 % ========================================================== global LTE_par bar = WaitBar(0,'仿真开始>>>',gcf,550,320); % 时间模拟标记 在19.8s处理完成,将数据保存待发送,否则丢弃 LTE_par.genFlag = 1; fprintf('仿真起始帧号为 %d 子帧号为 %d \n',LTE_par.iFrame,LTE_par.iSubFrame); LTE_schedule_subband % 此处只对用户分配到固定的子带上 for iSimu = 1:LTE_par.nTime str = sprintf('当前进行第 %d 次仿真>>>',iSimu); WaitBar(iSimu/LTE_par.nTime,bar,str); nUE = LTE_par.nUE; % 用户总数 CP = LTE_par.CP; % 循环前缀长度 nTx = LTE_par.BS_par.nAnt; % 基站端天线数 RNTI = LTE_par.UE_par.RNTI; % 无线网络临时指示 cellID = LTE_par.BS_par.cellID; % 小区ID号 iSubFrame = LTE_par.iSubFrame; % 当前子帧号 取值为0~9 FFT_SIZE = LTE_par.FFT_SIZE; % FFT变换点数 transMod = LTE_par.UE_par.transMod; % 传输模式 1~7 preProcess = LTE_par.UE_par.preProcess; % 预处理模式 1:singleAnt,2:tranmitDiversity 3:spatialMultiplexing % 基带处理起始时间 t0 = clock; % 打印输出当前用户参数配置 show_par(); if LTE_par.errFlag == false % ===================PRBS 数据产生器 =============================== % PRBS起始时间 t0 = clock; saveSendInfo = cell(nUE,1); for iUE = 1:nUE sizeTB = LTE_par.UE_par.sizeTB(:,iUE); % iUE的传输块大小 % 信息生成 sendInfoBit = info_gen(sizeTB); saveSendInfo{iUE} = sendInfoBit; end % PRBS结束时间 time = etime(clock,t0); if time < 0.2 pause(0.2-time); % 延时到指定时刻 end fprintf('PRBS数据生成模块处理完成\n'); % =================== 基带处理模块 =================================== for iUE = 1:nUE nTB = LTE_par.UE_par.nCW(iUE); % iUE的TB数 nLayer = LTE_par.UE_par.nLayer(iUE); % iUE的层数 PMI = LTE_par.UE_par.PMI(iUE); % 第iUE个用户的预编码码本索引 M_0_SYMB = LTE_par.UE_par.M_0_SYMB(iUE);% 码字0调制符号数 cbConcatBit = cell(nTB,1); % 保存码块级联符号 modSymbCell = cell(nTB,1); % 保存调制符号 f = []; % 码块级联临时变量 sendInfoBit = saveSendInfo{iUE}; for iTB = 1:nTB Qm = LTE_par.UE_par.Qm(iTB,iUE); % 调制方式对应的阶数 % 码块分割 segBit = codeblock_segment(sendInfoBit{iTB},iUE,iTB); nCB = LTE_par.UE_par.nCB(iTB,iUE); % 获取当前用户CB数 for iCB = 1:nCB % Turbo 编码 encodeBit = turbo_encoder(segBit{iCB}); if strcmp(LTE_par.setpar, 'loadPar'); saveCodeBit((iCB-1)*3+1:iCB*3,:) = encodeBit; end % 速率匹配 rateMatchBit = rate_match(encodeBit,iUE,iTB,iCB); % 码块级联 f = cat(2,f,rateMatchBit); end % 加扰 scrambleBit = scramble(f,iTB,RNTI,iSubFrame,cellID); % 调制 modSymb = modulation(scrambleBit,Qm); modSymbCell{iTB} = modSymb; cbConcatBit{iTB} = f; f = []; end % 层映射 layerSymb = layer_mapping(modSymbCell,nTB,nLayer,preProcess); % 预编码 precodedSymb = precoding(layerSymb,preProcess,transMod,nTx,PMI,M_0_SYMB); % 子载波映射 得到天线端口上资源格形式的复值符号 % 输出为cell类型 举例:mapSymbCell{iTx}(iCarr,iOfdm) mapSymbCell = sub_carr_mapping(precodedSymb,iUE); % 频谱搬移 频域位置交换{B A}-->{A B} for iTx = 1:nTx mapSymbCell{iTx} = [mapSymbCell{iTx}(FFT_SIZE/2+1:FFT_SIZE,:);mapSymbCell{iTx}(1:FFT_SIZE/2,:)]; end % % OFDM符号生成 ofdmSymb = ofdm_generation(mapSymbCell,FFT_SIZE,nTx,CP); end else fprintf('当前子帧参数配置错误,等待下一帧!!!\n'); end if strcmp(LTE_par.setpar, 'manuPar'); time = etime(clock,t0); pause(5-time); % ============== 从19.6s开始高层清零 产生新参数 并下发 ==================== fprintf('高层清零 产生新参数\n') t0 = clock; % 保存当前帧参数,用来估计业务复杂程度 save_par = LTE_par; updata_parameter(); time = etime(clock,t0); if time < 1 pause(1-time); end load NextPar; LTE_par = next_LTE_par; % =============== 从19.8s 检查参数合理性 ================================= fprintf('检查参数合理性 产生新参数\n') % 检查参数合理性 errorMsg = []; errNum = 1; % 参数检查函数 currentErrFlag = LTE_par.errFlag; LTE_check_parameters; if errNum == 1 LTE_par.errFlag = false; fprintf('下一个子帧参数配置正确\n') else LTE_par.errFlag = true; fprintf('下一个子帧参数配置错误\n') for iMsg = 1:errNum disp(errorMsg{iMsg}); end end % =============== 根据业务复杂程度,模拟基带处理时间 ====================== if currentErrFlag == false if sum(save_par.UE_par.nRB) > 0.8*save_par.RB_DL overFlow = 0.5+rand; if mean(mean(save_par.UE_par.Qm)) > 4; overFlow = overFlowFlag + 0.3; end else overFlow = 0.2+rand; end if overFlow > 1 fprintf('基带处理超时,数据抛弃 !\n') else fprintf('基带处理正常,数据保存 !\n') LTE_par.genFlag = LTE_par.genFlag+1; end else fprintf('参数配置错误,未做基带处理 !\n') end end % 将'业务数据.dat'在各个模块的信息保存 if strcmp(LTE_par.setpar, 'loadPar'); saveSegBit1 = segBit{1}; % 第一个码块分割后数据 2进制 saveSegBit2 = segBit{2}; % 第二个码块分割后数据 2进制 saveCodeBit1 = saveCodeBit(1:3,:); % 第一个码块编码后数据 2进制 saveCodeBit2 = saveCodeBit(4:6,:); % 第二个码块编码后数据 2进制 saveConBit = cbConcatBit{1}; % 速率匹配后码块级联数据 2进制 saveScrambleBit = scrambleBit; % 加扰后的数据 2进制 saveModSymb = modSymb; % 经过调制的复值符号 复数 % 将各模块数据结果保存为.mat文件 save 各模块数据.mat saveSegBit1 saveSegBit2 saveCodeBit1 saveCodeBit2 saveConBit saveScrambleBit saveModSymb % 将各模块数据结果保存为.dat文件 segment1 = '第一个码块分割后result.dat'; % 第一个码块分割后数据 16进制 write_result(saveSegBit1,segment1,0); segment2 = '第二个码块分割后result.dat'; % 第二个码块分割后数据 16进制 write_result(saveSegBit2,segment2,0); encode1 = '第一个码块编码后result.dat'; % 第一个码块编码后数据 16进制 write_result(saveCodeBit1,encode1,0); encode2 = '第二个码块编码后result.dat'; % 第二个码块编码后数据 16进制 write_result(saveCodeBit2,encode2,0); concat = '码块级联后数据result.dat'; % 速率匹配后码块级联数据 16进制 write_result(saveConBit,concat,0); scramb = '加扰后result.dat'; % 加扰后数据 16进制 write_result(saveScrambleBit,scramb,0); mod = '调制后result.dat'; % 调制后复值符号 复数 write_result(saveModSymb,mod,1); fprintf('仿真结果保存在当前文件夹下,分别保存为 .mat 格式和 .dat格式\n'); end end if strcmp(LTE_par.setpar, 'manuPar'); fprintf('可发送有效数据总计: %d 次\n',LTE_par.genFlag-1); end WaitBar(iSimu/LTE_par.nTime,bar,'仿真结束!!!'); pause(2); WaitBar(0,bar,'');